<?php

namespace TpAmis\util;

class AmisConfig
{
    /**
     * TpAmis相关设置
     */
    static $config = [

        // +----------------------------------------------------------------------
        // | 表格相关设置
        // +----------------------------------------------------------------------
        'page' => [
            'page_title' => '',    // 页面标题 
            'page_sub_title' => '',    // 页面副标题 
            'page_tips_top' => [],    // 页面头部提示
            'page_tips_bottom' => [],    // 页面底部提示
            'page_attribute' => [],    // 页面属性设置
            'tab_nav' => [],    // 页面Tab导航
            'tpl_path' => '',    // 模板路径
            '_js_files' => [],    // 需要加载的js（合并输出）
            '_js_init' => [],    // 初始化的js（合并输出）
            '_css_files' => [],    // 需要加载的css（合并输出）
            '_layout' => [],    // 布局参数
            'extend_js_list' => [],    // 扩展表单项js列表
            'extend_css_list' => [],    // 扩展表单项css列表
            'js_list' => [],    // 需要引入的js文件名
            'css_list' => [],    // 需要引入的css文件名
            'extra_html' => '',    // 额外HTML代码
            'extra_js' => '',    // 额外JS代码
            'extra_css' => '',    // 额外CSS代码
        ],
        'form' => [
            'form_title' => '',    // 表单标题
            'form_sub_title' => '',    // 表单副标题
            'form_tips_top' => [],    // 表单头部提示
            'form_tips_bottom' => [],    // 表单底部提示
            'form_attribute' => [],    // 表单属性设置'

            'api' => '',     //Form 用来保存数据的 api
            'initApi' => '',     //Form 用来获取初始数据的 api
            'initAsyncApi' => '',     //Form 用来获取初始数据的 api,与 initApi 不同的是，会一直轮询请求该接口，直到返回 finished 属性为 true 才 结束。
            'asyncApi' => '',     //设置此属性后，表单提交发送保存接口后，还会继续轮询请求该接口，直到返回 finished 属性为 true 才 结束。


        ],
        'table' => [
            'top_buttons' => [],       // 顶部栏按钮
            'right_buttons' => [],       // 表格右侧按钮
            'attribute' => [ //表属性配置
                'api' => '/', //CRUD 用来获取列表数据的 api。	
                'deferApi' => '', //当行数据中有 defer 属性时，用此接口进一步加载内容	
                'saveOrderApi' => '', //保存排序的 api。	
                'quickSaveApi' => '', // 表格空数据提示
                'quickSaveItemApi' => '', //快速编辑立即保存
                'affixHeader' => true, //是否固定表头(table 下)	
                'syncLocation' => false, //是否将过滤条件的参数同步到地址栏
                'pageField' => 'current_page', //设置分页页码字段名。	
                'perPageField' => 'per_page', //设置分页一页显示的多少条数据的字段名。注意：最好与 defaultParams 一起使用，请看下面例子。	
                'rowSelection' => true, //行相选择关配置 true为开启选择

            ],
            'columns' => [],       // 表格列集合
            'table_data_empty_tips' => '暂无数据 !', // 表格空数据提示
            'bulkActions' => [],
            'order_field' => [], //表格排序字段

        ]
    ];

    static $view;
    static $assign;
    static function setConfig(array $config = [])
    {
        static::$config = self::array_override(static::$config, $config);
    }

    /**
     * 将第一个多维数组的参数覆盖到第二个多维数组中
     * @param array $defaults 第二个多维数组，被覆盖
     * @param array $overrides 第一个多维数组，用于覆盖
     * @return array 覆盖后的数组
     */
    private static function array_override(array $defaults, array $overrides)
    {
        foreach ($overrides as $key => $value) {
            if (array_key_exists($key, $defaults)) {
                if (is_array($value) && is_array($defaults[$key])) {
                    // 递归处理子数组
                    $defaults[$key] = self::array_override($value, $defaults[$key]);
                } else {
                    // 覆盖当前键的值
                    $defaults[$key] = $value;
                }
            } else {
                // 添加新的键值对
                $defaults[$key] = $value;
            }
        }
        return $defaults;
    }

    static function getTpl()
    {
        return dirname(__DIR__) . DIRECTORY_SEPARATOR . 'view' . DIRECTORY_SEPARATOR . 'tpl.html';
    }

    /**
     * 获取配置
     * @param string $name
     * @return mixed
     */
    static function get($name = '')
    {
        if ($name == '') {
            return static::$config;
        }
        //php判断$name中是否有字符串"."
        if (strpos($name, '.') !== false) {
            return static::getNestedValue($name);
        }

        return static::$config[$name];
    }
    /**
     * 设置配置
     * @param $name
     * @param $value
     */
    static function set($name, $value = '')
    {
        if (is_array($name)) {
            static::$config = array_merge(static::$config, $name);
        } else {
            if (strpos($name, '.') !== false) {
                static::setNestedValue($name, $value);
            } else {
                static::$config[$name] = $value;
            }
        }
    }
    /**
     * 获取二级配置
     * 使用示例：
     * echo getNestedValue( "database.host"); // 输出：127.0.0.1
     * echo getNestedValue(  "app.version"); // 输出：1.0.0
     * @param $config
     * @param $path
     */
    static private function getNestedValue($path)
    {
        $keys = explode('.', $path);
        $value = static::$config;
        foreach ($keys as $key) {
            if (is_array($value) && array_key_exists($key, $value)) {
                $value = $value[$key];
            } else {
                return null; // 如果键不存在或者已经不是数组，则返回null
            }
        }

        return $value;
    }
    /**
     * 设置多个配置
     * @param $name
     * @param $value
     */
    static private function setNestedValue($name, $value)
    {
        $keys = explode('.', $name);
        $config = &static::$config;
        while (count($keys) > 1) {
            $key = array_shift($keys);
            if (!isset($config[$key]) || !is_array($config[$key])) {
                $config[$key] = [];
            }
            $config = &$config[$key];
        }
        $config[array_shift($keys)] = $value;
    }





}
